﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using System.Data.SqlClient;
using System.Data;

namespace DAO
{
    public static class ClaseDAO
    {
        public static bool validarHorarios(Horarios horario, Clase clase)
        {
            if (horario.HoraFin <= horario.HoraInicio)
                return false;
            foreach (Horarios hor in clase.ListadoHorarios)
            {
                if (horario.Dia == hor.Dia)
                {
                    return false;
                }
            }
            return true;
        }
        public static void agregarClase(Clase clase)
        {
            SqlConnection con = DB.conexion();
            SqlTransaction tran = con.BeginTransaction();
            try
            {

                string query = "INSERT INTO Clase (cla_pro_id, cla_act_id, cla_sal_id) VALUES (@profesorId, @actividadId, @salaId); SELECT MAX(cla_id) FROM Clase;";
                SqlCommand cmd = new SqlCommand(query, con, tran);
                cmd.Parameters.Add(new SqlParameter("@profesorId", clase.Profesor.Id));
                cmd.Parameters.Add(new SqlParameter("@actividadId", clase.Actividad.Id));
                cmd.Parameters.Add(new SqlParameter("@salaId", clase.Sala.Id));
                clase.Id = (int)cmd.ExecuteScalar();
                foreach (Horarios hor in clase.ListadoHorarios)
                {
                    query = "INSERT INTO Horarios (hor_cla_id, hor_hora_inicio, hor_hora_fin, hor_dia) VALUES (@claseId, @horaInicio, @horaFin, @dia);";
                    cmd = new SqlCommand(query, con, tran);
                    cmd.Parameters.Add(new SqlParameter("@claseId", clase.Id));
                    cmd.Parameters.Add(new SqlParameter("@horaInicio", hor.HoraInicio));
                    cmd.Parameters.Add(new SqlParameter("@horaFin", hor.HoraFin));
                    cmd.Parameters.Add(new SqlParameter("@dia", hor.Dia));
                    cmd.ExecuteNonQuery();
                }
                tran.Commit();
            }
            catch (SystemException)
            {
                tran.Rollback();
            }
            finally
            {
                con.Close();
            }
        }

        public static List<Clase> obtenerClases()
        {
            List<Clase> listaClase = new List<Clase>();
            try
            {
                string query = "SELECT c.cla_id, c.cla_pro_id, p.pro_nombre, p.pro_apellido, c.cla_act_id, a.act_descripcion, c.cla_sal_id, s.sal_descripcion ";
                query += "FROM Clase c JOIN Profesor p ON c.cla_pro_id = p.pro_id ";
                query += "JOIN Actividad a ON c.cla_act_id = a.act_id ";
                query += "JOIN Sala s ON c.cla_sal_id = s.sal_id ";
                query += "WHERE cla_fecha_baja IS NULL;";
                SqlDataReader dr = DB.GenerarReader(query);
                while (dr.Read())
                {
                    Clase clase = new Clase();
                    clase.Id = int.Parse(dr["cla_id"].ToString());
                    clase.Profesor.Id = int.Parse(dr["cla_pro_id"].ToString());
                    clase.Profesor.Nombre = dr["pro_nombre"].ToString();
                    clase.Profesor.Apellido = dr["pro_apellido"].ToString();
                    clase.Actividad.Id = int.Parse(dr["cla_act_id"].ToString());
                    clase.Actividad.Descripcion = dr["act_descripcion"].ToString();
                    clase.Sala.Id = int.Parse(dr["cla_sal_id"].ToString());
                    clase.Sala.Descripcion = dr["sal_descripcion"].ToString();
                    query = "SELECT h.hor_hora_inicio, h.hor_hora_fin, h.hor_dia ";
                    query += "FROM Horarios h JOIN Clase c ON h.hor_cla_id = c.cla_id ";
                    query += "WHERE h.hor_fecha_baja IS NULL ";
                    query += "AND h.hor_cla_id = @claseID;";
                    List<SqlParameter> listaParameters = new List<SqlParameter>();
                    listaParameters.Add(new SqlParameter("@claseID", clase.Id));
                    SqlDataReader dr2 = DB.GenerarReader(query, listaParameters);
                    List<Horarios> listaHorario = new List<Horarios>();
                    while (dr2.Read())
                    {
                        Horarios horario = new Horarios();
                        horario.HoraInicio = TimeSpan.Parse(dr2["hor_hora_inicio"].ToString());
                        horario.HoraFin = TimeSpan.Parse(dr2["hor_hora_fin"].ToString());
                        horario.Dia = dr2["hor_dia"].ToString();
                        listaHorario.Add(horario);
                    }
                    clase.ListadoHorarios = listaHorario;
                    listaClase.Add(clase);
                }
            }
            catch
            {

            }
            return listaClase;
        }
        public static void bajaClase(Clase clase)
        {
            SqlConnection con = DB.conexion();
            SqlTransaction tran = con.BeginTransaction();
            try
            {
                string query = "UPDATE Clase SET cla_fecha_baja = GETDATE() ";
                query += "WHERE cla_id = @id;";
                SqlCommand cmd = new SqlCommand(query, con, tran);
                cmd.Parameters.Add(new SqlParameter("@id", clase.Id));
                cmd.ExecuteNonQuery();
                query = "UPDATE Horarios SET hor_fecha_baja = GETDATE() ";
                query += "WHERE hor_cla_id = @id;";
                cmd = new SqlCommand(query, con, tran);
                cmd.Parameters.Add(new SqlParameter("@id", clase.Id));
                cmd.ExecuteNonQuery();
                query = "UPDATE SocioXClase SET scl_fecha_baja = GETDATE() ";
                query += "WHERE scl_cla_id = @id;";
                cmd = new SqlCommand(query, con, tran);
                cmd.Parameters.Add(new SqlParameter("@id", clase.Id));
                cmd.ExecuteNonQuery();
                tran.Commit();
            }
            catch (SystemException)
            {
                tran.Rollback();
            }
            finally
            {
                con.Close();
            }
        }

        public static Clase buscarClaseId(Clase clase)
        {
            
            try
            {
                string query = "SELECT c.cla_id, c.cla_pro_id, p.pro_nombre, p.pro_apellido, c.cla_act_id, a.act_descripcion, c.cla_sal_id, s.sal_descripcion ";
                query += "FROM Clase c JOIN Profesor p ON c.cla_pro_id = p.pro_id ";
                query += "JOIN Actividad a ON c.cla_act_id = a.act_id ";
                query += "JOIN Sala s ON c.cla_sal_id = s.sal_id ";
                query += "WHERE cla_id = @claseId;";
                List<SqlParameter> listaParam = new List<SqlParameter>();
                listaParam.Add(new SqlParameter("@claseId", clase.Id));
                SqlDataReader dr = DB.GenerarReader(query,listaParam);
                while (dr.Read())
                {
                    clase.Profesor.Id = int.Parse(dr["cla_pro_id"].ToString());
                    clase.Profesor.Nombre = dr["pro_nombre"].ToString();
                    clase.Profesor.Apellido = dr["pro_apellido"].ToString();
                    clase.Actividad.Id = int.Parse(dr["cla_act_id"].ToString());
                    clase.Actividad.Descripcion = dr["act_descripcion"].ToString();
                    clase.Sala.Id = int.Parse(dr["cla_sal_id"].ToString());
                    clase.Sala.Descripcion = dr["sal_descripcion"].ToString();
                    query = "SELECT h.hor_hora_inicio, h.hor_hora_fin, h.hor_dia ";
                    query += "FROM Horarios h JOIN Clase c ON h.hor_cla_id = c.cla_id ";
                    query += "WHERE h.hor_fecha_baja IS NULL ";
                    query += "AND h.hor_cla_id = @claseID;";
                    List<SqlParameter> listaParameters = new List<SqlParameter>();
                    listaParameters.Add(new SqlParameter("@claseID", clase.Id));
                    SqlDataReader dr2 = DB.GenerarReader(query, listaParameters);
                    List<Horarios> listaHorario = new List<Horarios>();
                    while (dr2.Read())
                    {
                        Horarios horario = new Horarios();
                        horario.HoraInicio = TimeSpan.Parse(dr2["hor_hora_inicio"].ToString());
                        horario.HoraFin = TimeSpan.Parse(dr2["hor_hora_fin"].ToString());
                        horario.Dia = dr2["hor_dia"].ToString();
                        listaHorario.Add(horario);
                    }
                    clase.ListadoHorarios = listaHorario;
                    
                }
            }
            catch(SystemException)
            {

            }
            return clase;
        }

        public static void modificarClase(Clase clase)
        {
            string query = "UPDATE Clase SET cla_pro_id = @profesorId, cla_act_id = @actividadId, cla_sal_id = @salaId ";
            query += "WHERE cla_id = @claseId;";
            List<SqlParameter> listaParam = new List<SqlParameter>();
            listaParam.Add(new SqlParameter("@claseId", clase.Id));
            listaParam.Add(new SqlParameter("@profesorId", clase.Profesor.Id));
            listaParam.Add(new SqlParameter("@actividadId", clase.Actividad.Id));
            listaParam.Add(new SqlParameter("@salaId", clase.Sala.Id));
            DB.EjecutarCommand(query, listaParam);
        }

        public static DataTable obtenerClase(int id)
        {
            string query = "SELECT cla.cla_id id, act.act_descripcion+' - '+sal.sal_descripcion+' - '+pro.pro_apellido descripcion";
            query += "        FROM Clase cla " ;
            query += "     , Actividad act ";
            query += "     , Sala sal ";
            query += "     , Profesor pro , SocioXClase scl ";
            query += " WHERE cla.cla_act_id = act.act_id ";
            query += "   AND cla.cla_sal_id = sal.sal_id ";
            query += "   AND cla.cla_pro_id = pro_id ";
            query += "   AND cla.cla_fecha_baja is null ";
            query += "   AND scl.scl_cla_id = cla.cla_id ";
            query += "   AND scl.scl_soc_id = @id ;";

            SqlCommand cmd = new SqlCommand(query,DB.conexion());
            cmd.Parameters.Add(new SqlParameter("@id",id));
            DataTable dt = new DataTable();
            try
            {
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);

            }
            catch (Exception) { throw new Exception("No se pudieron cargar clases"); }

            return dt;
        }
    }
}
